#!/usr/bin/env bash
 
# С каким интервалом будем проводить проверки
TIME_BASIS=5
 
# Опции командной строки
[[ ${1:-none} == '-h' ]] && { echo -e Использование:\\n\\t-h\\t\\t\Подсказка\\n\\t-t ЦИФРА\\tВременной базис, по умолчанию 5 секунд ; exit 0 ;}
 
# Регулярное выражение, которое нужно в следующей проверке
RE='^[0-9]+$'
# Здесь сложная схема из трёх if и одного else прописана в 1 строку
[[ ${1:-none} == '-t' ]] && { [[ $2 =~ $RE ]] && TIME_BASIS=$2 || { echo После -t должно идти число! ; exit 1 ;} ;}
# На случай, если указана недопустимая опция
[[ ${1:-none} != '-t' && ${1:-none} != '-h' && ${1:-none} != 'none' ]] && { echo Указана недопустимая опция! ; exit 1 ;}
 
# Если запускаемся на ванили
[ -f /home/postgres/.profile_postgres ] && { source /home/postgres/.profile_postgres ; alias psql='psql -h /tmp' ;}
 
 
if [[ `psql -tA -c "SELECT pg_is_in_recovery()"` == "t" ]] ; then
        # Ветка отрабатывает если мы на реплике
        while true ; do
            # Вычисляем номер вала и номер сегмента (средней части имени файла)
            WAL_1=`ps x | grep -E "startup[[:space:]]*recovering" | grep -v grep | awk '{print $NF}' | cut -c 17-`
            TL_1=`ps x | grep -E "startup[[:space:]]*recovering" | grep -v grep | awk '{print $NF}' | cut -c 9-16`
            sleep $TIME_BASIS
            WAL_2=`ps x | grep -E "startup[[:space:]]*recovering" | grep -v grep | awk '{print $NF}' | cut -c 17-`
            TL_2=`ps x | grep -E "startup[[:space:]]*recovering" | grep -v grep | awk '{print $NF}' | cut -c 9-16`
 
            # Когда сегменты переключаются, вычисление работает не корректно, пропускаем эту итерацию
            [ $TL_1 == $TL_2 ] && echo За $TIME_BASIS секунд накатывается `echo "ibase=16; $WAL_2 - $WAL_1" | bc` валов || echo Переключился сегмент, не считаем валы
        done
else
        # Ветка для мастера
        while true ; do
                PREV_LSN=`psql -tA -c "SELECT pg_current_wal_lsn()"`
                sleep $TIME_BASIS
                DATA_AMOUNT=`psql -tA -c "SELECT round( ( pg_wal_lsn_diff( pg_current_wal_lsn(), '$PREV_LSN' )/1024 ), 2 )"`
                echo За $TIME_BASIS секунд накатывается $DATA_AMOUNT мегабайт
        done
fi